using System;
using System.Collections;
using Tecnicas.CasoEstudio.Repositorio;
using Tecnicas.CasoEstudio.Back.Persistencia;

namespace Tecnicas.CasoEstudio.Back.Dominio
{
    [Serializable]
	public class Cliente : DomainObject
	{
        private string nombre;
		public string Nombre
		{
            get { return this.nombre; }
		}

        private ArrayList persistenceIdAlquileres = new ArrayList();
        public ArrayList PersistenceIdAlquileres
        {
            get { return this.persistenceIdAlquileres; }
            set { this.persistenceIdAlquileres = value; }
        }
        private ArrayList alquileres = new ArrayList();
        public void AddAlquiler(Alquiler alquiler)
		{
            this.alquileres.Add(alquiler);
            this.persistenceIdAlquileres.Add(alquiler.PersistenceId);
		}
        public ArrayList GetAlquileres()
        {            
            foreach(long? alquilerId in this.PersistenceIdAlquileres)
            {
                this.alquileres.Add(new AlquilerDataMapper().Find(alquilerId));
            }                 
            return this.alquileres;
        }

        public Cliente(string nombre)
		{
            this.nombre = nombre;
		}

		public string getReporte()
		{
				double totalAcumulado = 0;
				int puntosAlquilerFrecuente = 0;
				String salida = "Alquileres para " + this.Nombre + "\n";
                foreach (Alquiler alquiler in this.alquileres) 
				{
					double monto = 0;
					//determine amounts for each line
                    switch (alquiler.Pelicula.CodigoPrecio) 
					{
						case Pelicula.REGULAR:
							monto += 2;
                            if (alquiler.DiasAlquilada > 2)
                                monto += (alquiler.DiasAlquilada - 2) * 1.5;
							break;
						case Pelicula.ESTRENO:
                            monto += alquiler.DiasAlquilada * 3;
							break;
						case Pelicula.INFANTIL:
							monto += 1.5;
                            if (alquiler.DiasAlquilada > 3)
                                monto += (alquiler.DiasAlquilada - 3) * 1.5;
							break;
					}
					// add frequent renter points

					puntosAlquilerFrecuente ++;
					// add bonus for a two day new release rental
                    if ((alquiler.Pelicula.CodigoPrecio == Pelicula.ESTRENO) &&
                        alquiler.DiasAlquilada > 1) puntosAlquilerFrecuente++;
					//show figures for this rental
                    salida += "\t" + alquiler.Pelicula.Titulo + "\t\t\t $" +
						monto.ToString() + "\n";
					totalAcumulado += monto;
				}
			//add footer lines
                salida += "Total: \t\t\t\t$" + totalAcumulado + "\n";
                salida += "Puntos Acumulados: \t\t" + puntosAlquilerFrecuente + " pts.";
			return salida;
		}
		
		
		
	}
}
